<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >

   <head>
       <title>Rapport du projet OpenGL</title>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
	<link rel="stylesheet" media="screen" type="text/css" title="Style" href="style.css" />

   </head>

   <body>
	<p id="noms">MURACCIOLE Lea<br/>
	   ROUSSEAU Leo <br/>
	   2A32</p>


	    <h1> RAPPORT DU PROJET D'OPENGL</h1>


	<h2 class="Titres"> I EXPLICATION DU PROJET  </h2>
	    <p> Lors de ce projet, nous devions :        </p>
		<ul>
		    <li>Afficher un terrain en 3D</li>
		    <li>Affichez un terrain texturé</li>
		    <li>Affichez des maillages representant des objets sur le terrain</li>
		    <li>Changez le point de vue en adoptant celui les objets</li>

		</ul>

	<h2 class="Titres"> II EXPLICATION DE NOS CHOIX	</h2>
	    <p> Nous avons fait un diagramme de classe pour resumer la hierarchie de nos classes.<p/>
	    <img src="classes.jpg" alt="Diagramme de classe "/>
		<p>
			Ce choix d'une architecture distribuée en plusieurs classe nous a permis de ne pas avoir à gérer les état sucessifs
			d'OpenGL. En effet, lorsqu'on est dans une instance d'un objet, on sait exactement dans quel état on doit être.
			Il suffit alors de l'activer et de le désactiver une foie le traitement effectué.
		</p>
		    
		<h3 class="Titres"> II-A LES LECTEURS DE FICHIERS</h3>
		<p>
			Le projet était axé sur la lecture des deux types de fichiers de points : les fichiers mnt (relevés topographiques d'altitudes au mètre carré),
			et les fichiers off.
		</p>
			<h4>L'interface IFile</h4>
			<p>
				L'interface IFile permet de regrouper un ensemble de fonctions virtuelles qui vont permettre de lire les données des fichiers
				et les stocker dans les tableaux adéquats. Elle pourvoit aussi des observateurs sur ces tableaux.
			</p>

			<h4>OffFile</h4>
			<p>
				La classe OffFile permet de lire un fichier off. Elle lit d'abbord les paramètres du maillage en entête de fichier puis,elle lit les 
				indices.
			</p>

			<h4>MntFile</h4>
			<p>
				La classe MntFile permet de lire un fichier mnt. Elle lit d'abbord les paramètres du maillage en entête de fichier. Elle calcule
				ensuite le tableau d'indices et enfin génère les coordonnées de la texture qui sera plaquée sur le terrain
			</p>

	<h3 class="Titres"> II-B LES AFFICHEURS ET LE MESH</h3>
	<p>
		Dans la mesure où il était demandé d'afficher des données en 3D, nous devions fournir une architecture capable de s'adapter à la fois aux spécificités
		du format mnt et celles du format off.
	</p>

		<h4>L'interface Displayer</h4>
			<p>
				Tout ce qui aura la capacité d'afficher un objet 3D devra implémenter la fonction display de cette interface. Elle permet aussi de conserver un 
				pointeur vers le lecteur du fichier d'où proviennent les données de l'objet afin d'éviter de recopies couteuses en mémoire.
			</p>

		<h4>Objet3D et MntDisplayer</h4>
			<p>
				Ces deux classes permettent d'afficher, et éventuellement de plaquer des textures sur des maillages respectivement de type off et mnt.
			</p>

		<h4>Mesh</h4>
			<p>
				Cette classe encapsule un vecteur d'Objet3D. Ainsi pour afficher la scène il suffira de parcourir le vecteur et d'appeler la fonction
				display de chaque objet.
			</p>

	<h3 class="Titres"> II-C LA CAMERA</h3>
	<p>
		Une scène 3D n'est visible que s'il y a une caméra qui permet de projetter la visualisation vers l'écran. Il existe différents types de caméra, mais nous
		avons optés pour une free-fly-camera, c'est à dire une caméra pilotée au clavier (pour le déplacement) et à la souris (pour les directions).
		Cette caméra permet une visualisation fluide et un déplacement instinctif.
	</p>
	<p>
		L'implémentation repose sur une classe qui encapsule les traitements mathématiques des vecteurs à 3 dimensions et est directement liée à la gestion des évènements.
		C'est pourquoi tous les évènements résultants de la souris et certains évènements provenant du clavier lui sont envoyés. Le but est de pouvoir calculer, en fonction
		de la position de la caméra ce qu'elle regarde (sa cible). Pour celà, à chaque fois que la souris est déplacée une soustraction entre les anciennes coordonnées et les
		nouvelles coordonnées du pointeur dans le plan de l'écran permet de calculer l'angle de vue, et dong les composantes du vecteur cible.
		A l'inverse de la souris, des évènements clavier vont agir directement non pas sur le vecteur cible, mais sur le vecteur position de la caméra.
	</p>
		
	<h2 class="Titres"> III COMMANDES ET PILOTAGE DU PROGRAMME</h2>
		<ul>
		    <li>Avancer                                : 'z'</li>
		    <li>Reculer                                : 's'</li>
		    <li>Aller à gauche                         : 'q'</li>
		    <li>Aller à droite                         : 'd'</li>
                    <li>Augmenter la vitesse de déplacement    : touche espace(appui continu)</li>
		    <li>Sélectionner l'avion                   : 'a'</li>
		    <li>Sélectionner le vaisseau Klingon       : 'k'</li>
                    <li>Sélectionner la station spatiale       : 'n'</li>
		    <li>Annuler la sélection d'un objet        : 'c'</li>
                    <li>Passer en mode fil de fer              : 'f'</li>
                    <li>Passer en mode plein                   : 'p'</li>
		    <li>Quitter le programme                   : touche echap</li>

		</ul>

	<h2 class="Titres"> IV VIDEOS DE DEMONSTRATION</h2>
		<center>
		<!-- l'objet type pour une application flash, avec ses dimensions -->
		<!-- et, en data, l'url du « player » -->
		<object height="600" width="800"
		type="application/x-shockwave-flash"
		data="player_flv_maxi.swf" >
		<!-- paramètre obligatoire : l'url de la video à montrer -->
		<param name="FlashVars" value="flv=nom_video" >
		<!-- options possibles pouvant être ajoutées dans le champ value -->
		<!-- à la fin de l'url, avant le " final -->
		<!--
		&autoload=1
		&autoplay=1
		&loop=1
		&margin=1
		&showstop=1
		&showvolume=1
		&showtime=2
		&showplayer=always
		&showloading=always
		&showfullscreen=1
		-->
		<!-- paramètre obligatoire si l'on souhaite pouvoir passer en plein écran -->
		<param name="allowFullScreen" value="true" >
		</object>
		</center>

   </body>
</html>
